home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / shar-3.49 / uushar.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  1KB  |  74 lines

  1. /* $Header: /u/rhg/src/shar/uushar.c,v 3.49 90/09/12 15:15:26 rhg Exp $ */
  2.  
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6.  
  7. /* ENC is the basic 1 character encoding function to make a char printing */
  8. #if 1 /* Richard H. Gumpertz (RHG@CPS.COM), 24 April 1990 */
  9. #define ENC(c) ((((c) + 077) & 077) + 041)
  10. #else /* RHG */
  11. #define ENC(c) ((((c) & 077) + ' ') | ((c & 077) == 0 ? 0100 : 0))
  12. #endif /* RHG */
  13.  
  14. encode (in, out)
  15.     FILE *in;
  16.     FILE *out;
  17. {
  18.     char  buf[80];
  19.     int  i, n;
  20.  
  21.     for (;;)
  22.     {
  23.     /* 1 (up to) 45 character line */
  24.     n = fr (in, buf, 45);
  25.     putc (ENC (n), out);
  26.  
  27.     for (i = 0; i < n; i += 3)
  28.         outdec (&buf[i], out);
  29.  
  30.     putc ('\n', out);
  31.     if (n <= 0)
  32.         break;
  33.     }
  34. }
  35.  
  36. /*
  37.  * output one group of 3 bytes, pointed at by p, on file f.
  38.  */
  39. outdec (p, f)
  40.     char *p;
  41.     FILE *f;
  42. {
  43.     int  c1, c2, c3, c4;
  44.  
  45.     c1 = *p >> 2;
  46.     c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
  47.     c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
  48.     c4 = p[2] & 077;
  49.     putc (ENC (c1), f);
  50.     putc (ENC (c2), f);
  51.     putc (ENC (c3), f);
  52.     putc (ENC (c4), f);
  53. }
  54.  
  55. /* fr: like read but stdio */
  56. int
  57.      fr (fp, buf, cnt)
  58.     FILE *fp;
  59.     char *buf;
  60.     int  cnt;
  61. {
  62.     int  c, i;
  63.  
  64.     for (i = 0; i < cnt; i++)
  65.     {
  66.     c = getc (fp);
  67.     if (c == EOF)
  68.         return (i);
  69.     buf[i] = c;
  70.     }
  71.     return (cnt);
  72. }
  73. /* vi: set tabstop=4 shiftwidth=4: */
  74.